feat: test to ensure etag constant means no PROPFIND on a folder
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Wed, 16 Jul 2025 17:14:26 +0000 (19:14 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Fri, 25 Jul 2025 06:51:47 +0000 (06:51 +0000)
should help ensure we send a PROPFIND only when the folder etag changes

if some metadata apparently change, this is not enough to send a
PROPFIND request

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
test/testpermissions.cpp

index ee4507c100f99c64c549584e06fbf6414aecd72f..0ef689edb9a17801c066fbbb0c99edda04ce7f42 100644 (file)
@@ -926,6 +926,50 @@ private slots:
         QVERIFY(itemInstruction(completeSpy, "file", CSYNC_INSTRUCTION_REMOVE));
         QVERIFY(discoveryInstruction(discovery, "file", CSYNC_INSTRUCTION_REMOVE));
     }
+
+    void testChangingPermissionsWithoutEtagChange()
+    {
+        FakeFolder fakeFolder{FileInfo{}};
+        QObject parent;
+
+        fakeFolder.setServerVersion(QStringLiteral("27.0.0"));
+
+        fakeFolder.remoteModifier().mkdir("groupFolder");
+        fakeFolder.remoteModifier().mkdir("groupFolder/simpleChildFolder");
+        fakeFolder.remoteModifier().insert("groupFolder/simpleChildFolder/otherFile");
+        fakeFolder.remoteModifier().mkdir("groupFolder/folderParent");
+        fakeFolder.remoteModifier().mkdir("groupFolder/folderParent/childFolder");
+        fakeFolder.remoteModifier().insert("groupFolder/folderParent/childFolder/file");
+
+        auto groupFolderRoot = fakeFolder.remoteModifier().find("groupFolder");
+        setAllPerm(groupFolderRoot, RemotePermissions::fromServerString("WDNVCKRMG"));
+
+        auto propfindCounter = 0;
+
+        fakeFolder.setServerOverride([&propfindCounter](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) -> QNetworkReply * {
+            Q_UNUSED(outgoingData)
+
+            if (op == QNetworkAccessManager::CustomOperation &&
+                request.attribute(QNetworkRequest::CustomVerbAttribute).toString() == QStringLiteral("PROPFIND")) {
+                ++propfindCounter;
+            }
+
+            return nullptr;
+        });
+
+        QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(propfindCounter, 5);
+
+        fakeFolder.setServerVersion(QStringLiteral("31.0.0"));
+
+        auto groupFolderRoot2 = fakeFolder.remoteModifier().find("groupFolder");
+        groupFolderRoot2->extraDavProperties = "<nc:is-mount-root>true</nc:is-mount-root>";
+
+        fakeFolder.remoteModifier().insert("groupFolder/simpleChildFolder/otherFile", 12);
+
+        QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(propfindCounter, 8);
+    }
 };
 
 QTEST_GUILESS_MAIN(TestPermissions)